/**
 * @brief: 将训练数据及其标签可视化
 * @author: mysticalwing
 * @modify: name            time            brief
 *          mysticalwing    2018.11.06      创建，同时完成了 'visualize_train_data' 方法
 */

#ifndef READ_IMAGE_H
#define READ_IMAGE_H

#include <string>
#include <vector>
#include <opencv2/opencv.hpp>

namespace tools
{

typedef std::vector<int> vec_t;
typedef std::vector<vec_t> tensor_t;

/******************************************************************************************
 * @brief: 将训练数据可视化
 */
void visualize_train_data(const std::string &data_root_path);

/******************************************************************************************
 * @brief: 从训练集文件中读取目标的 bounding box 坐标信息和类别信息
 * @param label_txt_file_path： 文件存取路径
 * @param indexes: bounding box 坐标
 * @param labels: 类别信息
 */
void extract_info_from_txt_file(const std::string &label_txt_file_path,
                                 std::vector<vec_t> &indexes,
                                 std::vector<std::string> &labels);

/******************************************************************************************
 * @brief: 从字符串中提取坐标信息和标签信息
 * @param str_line: 原始字符串
 * @param nums: 提取得到的坐标
 * @param label: 该目标的标签
 */ 
void extract_info_from_str_line(const std::string &str_line, vec_t &nums, std::string &label);

void extract_number_from_str(const std::string & str, std::vector<int> &nums, const std::string & spacer);

void extract_number_from_str(const std::string & str, std::vector<float> &nums, const std::string & spacer);

/******************************************************************************************
 * @brief: 在指定图片上画多边形
 * @param box_indexes: 多边形坐标数组
 */ 
void draw_box(cv::Mat &image, const vec_t &box_indexes,
              const cv::Scalar &color = cv::Scalar(0, 0, 255),
              const int line_width = 1);
}
#endif //READ_IMAGE_H
